#ifndef __CAP_GT9XX_H__
#define __CAP_GT9XX_H__

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "../../../BSP/GPIO_BSP/gpio_bsp.h"
#include "../../../BSP/I2C_BSP/i2c_bus.h"
#include "../../../../Tool/Soft_I2C/soft_i2c_bus.h"
#include "../../../BSP/EXTI_BSP/exti_bsp.h"
#include "../../Debug/debug_driver.h"
#include "rgb_display_driver.h"

/*开启软件模拟I2C*/
//#define GT9xx_Soft_I2C //软件模拟I2C未完成

/* 复位引脚 */
#define GPT9xx_RST_Port         PortD
#define GPT9xx_RST_Pin          Pin11

/* 中断引脚 */
#define GPT9xx_INT_Port         PortD
#define GPT9xx_INT_Pin          Pin13
#define GPT9xx_INT_EXTI_Line    Exti_Line_Pin13


/* 触屏名字 */
#define Name_GT911     "Touch_GT911"
#define Name_GT9157    "Touch_GT9157"

/* 配置最大字节长度 */
#define GT9xx_Config_Max_Length 240
/* 最大5点触摸 */
#define GT9xx_Max_Touch_Count   5

/* GT9xx地址枚举 */
typedef enum
{
	GT9xx_7Bit_Addr1 = 0x14,
	GT9xx_7Bit_Addr2 = 0x5d,
}WHT_GT9xx_Addr_enum;

/* GT9xx寄存器 */
typedef enum
{
	REG_CTRL  = 0x8040, // 控制寄存器
	REG_CFGS  = 0x8047, // 配置起始地址寄存器
	REG_X_MAX = 0x8048, // X坐标最大值
	REG_Y_MAX = 0x804A, // Y坐标最大值
	REG_SWITCH= 0x804D, // 模块开关
	REG_CHECK = 0x80FF, // 校验和寄存器
	REG_SAVE  = 0x8100, // 保存配置寄存器
	REG_PID   = 0x8140, // 产品ID寄存器

	REG_GSTID = 0x814E, // 当前检测到的触摸情况
	REG_TP1   = 0x814F, // 第一个触摸点数据地址
	REG_TP2   = 0x8157, // 第二个触摸点数据地址
	REG_TP3   = 0x815F, // 第三个触摸点数据地址
	REG_TP4   = 0x8167, // 第四个触摸点数据地址
	REG_TP5   = 0x816F, // 第五个触摸点数据地址
	REG_TP6   = 0x8177, // 第六个触摸点数据地址
	REG_TP7   = 0x817F, // 第七个触摸点数据地址
	REG_TP8   = 0x8187, // 第八个触摸点数据地址
	REG_TP9   = 0x818F, // 第九个触摸点数据地址
	REG_TP10  = 0x8197, // 第十个触摸点数据地址
}WHT_GT9xx_Reg_enum;

/* GT9xx信息 */
typedef struct
{
	char* name;
	WHT_GT9xx_Addr_enum addr;
	uint16_t max_x_width;
	uint16_t max_y_height;
}WHT_GT9xx_Info_t;

/* 屏幕坐标 */
typedef struct
{
    uint8_t State;
    uint16_t New_X;//最新的触摸值
    uint16_t New_Y;
	uint16_t New_W;
}WHT_Touch_Pos_t;/*负数值表示无新数据*/

/* 回调函数结构体 */
typedef struct
{
	const WHT_GT9xx_Info_t* WHT_Info;
	const WHT_Touch_Pos_t (*WHT_Touch_Pos)[GT9xx_Max_Touch_Count];
	void (*WHT_Init)(void);
	uint8_t (*WHT_Scan_I2C_Slave_Count)(void);
	void (*WHT_Reset)(void);
	void (*WHT_IRQ_Enable)(void);
	void (*WHT_IRQ_Disable)(void);
}WHT_GT9xx_Driver_t;

extern const WHT_GT9xx_Driver_t WHT_GT9xx_Driver;

#endif /* __CAP_GT9XX_H__ */
